// 文件名：set_whitelist_ops.cpp
// 目的：示例标准集合算法在 std::set 上的典型用法：差集、并集、交集，以及元素擦除。
// 场景：权限规则计算（白名单与黑名单合并/冲突分析）。
// 要点：
//   - std::set_difference(A,B,out)：产生 A\B（在 A 中但不在 B 中）的有序结果；
//   - std::set_union(A,B,out)：产生 A∪B（去重合并）；
//   - std::set_intersection(A,B,out)：产生 A∩B（共同元素）；
//   - 所有算法要求输入区间有序（std::set 天然有序），输出通过 std::inserter 插入到 std::set；
//   - erase(key)：O(log N) 擦除指定元素。
// 复杂度：上述集合算法均为线性 O(|A| + |B|)。
// 注意：
//   - 结果容器应预先清空或使用新的容器；
//   - 输出迭代器使用 std::inserter(result, result.end()) 以保持 set 有序插入。

#include <algorithm>
#include <iostream>
#include <iterator>
#include <set>
#include <string>
#include <vector>

// 打印任意可迭代容器的元素（以空格分隔）
template <typename Container>
void printSet(const std::string& label, const Container& c) {
    std::cout << label << ":";
    for (const auto& item : c) {
        std::cout << ' ' << item;
    }
    std::cout << '\n';
}

int main() {
    // 白名单与黑名单（有序且唯一）
    std::set<std::string> whitelist = {"login", "logout", "read", "write"};
    std::set<std::string> blacklist = {"delete", "write"};

    // A\B：白名单减去黑名单 -> 允许的操作
    std::set<std::string> allowed;
    std::set_difference(whitelist.begin(), whitelist.end(),
                        blacklist.begin(), blacklist.end(),
                        std::inserter(allowed, allowed.end()));
    printSet("Allowed actions", allowed);

    // 并集：两套规则的总合集
    std::set<std::string> unionSet;
    std::set_union(whitelist.begin(), whitelist.end(),
                   blacklist.begin(), blacklist.end(),
                   std::inserter(unionSet, unionSet.end()));
    printSet("Union of rules", unionSet);

    // 交集：潜在冲突项（同时出现在白/黑名单）
    std::set<std::string> overlap;
    std::set_intersection(whitelist.begin(), whitelist.end(),
                          blacklist.begin(), blacklist.end(),
                          std::inserter(overlap, overlap.end()));
    printSet("Potential conflicts", overlap);

    // 擦除：移除过期的黑名单项
    blacklist.erase("write");
    printSet("Blacklist after cleanup", blacklist);

    return 0;
}